package com.google.gwt.sample.dynatablerf.server.domain;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

@Entity
@NamedQueries({

		@NamedQuery(name = Projeto.PROJETO_SUGGEST_QUERY, query = "SELECT p FROM Projeto p WHERE "
				+ "(p.numero like :suggestParam) "
				+ "OR (p.descricao like :suggestParam)"),

		@NamedQuery(name = Projeto.PROJETO_PESQUISAR, query = "SELECT p FROM Projeto p WHERE "
				+ "(:id is null or p.id = :id) "
				+ "AND (:numero is null or p.numero like :numero)"
				+ "AND (:descricao is null or p.descricao like :descricao)"),

		@NamedQuery(name = Projeto.PROJETO_COUNT, query = "SELECT COUNT(*) FROM Projeto p WHERE "
				+ "(:id is null or p.id = :id) "
				+ "AND (:numero is null or p.numero like :numero)"
				+ "AND (:descricao is null or p.descricao like :descricao)")

})
public class Projeto extends AbstractEntity implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static final String PROJETO_PESQUISAR = "Projeto.pesquisar";

	public static final String PROJETO_COUNT = "Projeto.count";

	public static final String PROJETO_SUGGEST_QUERY = "Projeto.suggest_query";

	private String numero;

	private String descricao;

	@ManyToOne
	private TipoInstalacao tipoInstalacao;

	@ManyToOne
	private ODI odi;

	private Date dataInicio;

	private Date dataLancamento;

	private Date dataEnergizacao;

	private Date dataInutilizacao;

	private double somatorioValorCOM;

	private double somatorioValorUC;

	private double somatorioValorCA;

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "projeto")
	private Set<MaterialProjeto> materialProjetoSet;

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "projeto")
	private Set<ServicoProjeto> servicoProjetoSet;

	public Projeto() {
		super();
	}

	public Projeto(String numero, String descricao) {
		this(numero, descricao, null, null, null, null, null, null);
	}

	public Projeto(String numero, String descricao,
			TipoInstalacao tipoInstalacao, ODI odi, Date dataInicio,
			Date dataLancamento, Date dataEnergizacao, Date dataInutilizacao) {
		this();
		this.numero = numero;
		this.descricao = descricao;
		this.tipoInstalacao = tipoInstalacao;
		this.odi = odi;
		this.dataInicio = dataInicio;
		this.dataLancamento = dataLancamento;
		this.dataEnergizacao = dataEnergizacao;
		this.dataInutilizacao = dataInutilizacao;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public TipoInstalacao getTipoInstalacao() {
		return tipoInstalacao;
	}

	public void setTipoInstalacao(TipoInstalacao tipoInstalacao) {
		this.tipoInstalacao = tipoInstalacao;
	}

	public ODI getOdi() {
		return odi;
	}

	public void setOdi(ODI odi) {
		this.odi = odi;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((numero == null) ? 0 : numero.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Projeto other = (Projeto) obj;
		if (numero == null) {
			if (other.numero != null)
				return false;
		} else if (!numero.equals(other.numero))
			return false;
		return true;
	}

	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Date getDataLancamento() {
		return dataLancamento;
	}

	public void setDataLancamento(Date dataLancamento) {
		this.dataLancamento = dataLancamento;
	}

	public Date getDataEnergizacao() {
		return dataEnergizacao;
	}

	public void setDataEnergizacao(Date dataEnergizacao) {
		this.dataEnergizacao = dataEnergizacao;
	}

	public Date getDataInutilizacao() {
		return dataInutilizacao;
	}

	public void setDataInutilizacao(Date dataInutilizacao) {
		this.dataInutilizacao = dataInutilizacao;
	}

	public Set<MaterialProjeto> getMaterialProjetoSet() {
		return materialProjetoSet;
	}

	public void setMaterialProjetoSet(Set<MaterialProjeto> materialProjetoSet) {
		this.materialProjetoSet = materialProjetoSet;
	}

	public void addMaterialProjeto(MaterialProjeto materialProjeto) {
		if (getMaterialProjetoSet() == null)
			setMaterialProjetoSet(new HashSet<MaterialProjeto>());
		getMaterialProjetoSet().add(materialProjeto);
	}

	public Set<ServicoProjeto> getServicoProjetoSet() {
		return servicoProjetoSet;
	}

	public void setServicoProjetoSet(Set<ServicoProjeto> servicoProjetoSet) {
		this.servicoProjetoSet = servicoProjetoSet;
	}

	public void addServicoProjeto(ServicoProjeto servicoProjeto) {
		if (getServicoProjetoSet() == null)
			setServicoProjetoSet(new HashSet<ServicoProjeto>());
		getServicoProjetoSet().add(servicoProjeto);
	}

	public double getSomatorioValorCOM() {
		return somatorioValorCOM;
	}

	public void setSomatorioValorCOM(double somatorioValorCOM) {
		this.somatorioValorCOM = somatorioValorCOM;
	}

	public double getSomatorioValorUC() {
		return somatorioValorUC;
	}

	public void setSomatorioValorUC(double somatorioValorUC) {
		this.somatorioValorUC = somatorioValorUC;
	}

	public double getSomatorioValorCA() {
		return somatorioValorCA;
	}

	public void setSomatorioValorCA(double somatorioValorCA) {
		this.somatorioValorCA = somatorioValorCA;
	}

}
